package Text32;

import java.io.*;

public class Main {
    /*输入的第一行包含两个整数 n,m，分别表示节点数量和操作数量。节点从 1至 n编号。
    接下来 m行，每行三个整数，表示一个操作。
    如果操作为 1 a b，表示将节点 a和节点 b 通过网线连接起来。当 a = b 时，表示连接了一个自环，对网络没有实质影响。
    如果操作为 2 p t，表示在节点 p上发送一条大小为 t 的信息。

    输出格式:
    输出一行，包含 n个整数，相邻整数之间用一个空格分割，
    依次表示进行完上述操作后节点 1至节点 n上存储信息的大小。*/
    static int N = 10010;
    static int[] p = new int[N];
    static int[] d = new int[N];

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] s = in.readLine().split(" ");
        int n = Integer.parseInt(s[0]);
        int m = Integer.parseInt(s[1]);
        for (int i = 1; i <= n; i++) {
            p[i] = i;
        }
        while (m-- > 0) {
            String[] str = in.readLine().split(" ");
            int op = Integer.parseInt(str[0]);
            int a = Integer.parseInt(str[1]);
            int b = Integer.parseInt(str[2]);
            if (op == 1) {
                int x = find(a);
                int y = find(b);
                if (x != y) {
                    d[x] -= d[y];
                }
                p[x] = y;
            } else if (op == 2) {
                int x = find(a);
                d[x]+=b;
            }
        }
        for (int i = 1; i <=n ; i++) {
            if(i==find(i)){
                out.write(d[i]+" ");
            }else {
                out.write(d[i]+d[find(i)]+" ");
            }
        }
        out.flush();
    }

    private static int find(int x) {
        if (x == p[x] || p[x] == p[p[x]]) {
            return p[x];
        }
        int root = find(p[x]);
        d[x] += d[p[x]];
        p[x] = root;
        return p[x];
    }
}
